package com.lqk.fnandroid

import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer

/**
 *
 * @auther LQK 2025-03-17 23:38
 */
class CustomMutableLiveData<T> : MutableLiveData<T>() {
    override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
        super.observe(owner, observer)
//        hook()
    }


    fun hook() {
        // 修改 存储 在 LiveData 中 的 Observer 中的 mLastVersion

        // 获取到 LiveData 的 类中 的 mObservers 对象
        // 1. 获取 类对象
        val liveDataCls = LiveData::class.java

        // 获取到 mObservers 这个成员变量 的 属性 // null
        val filedObservers = liveDataCls.getDeclaredField("mObservers")
        //
        var userInfoCls = (LiveDataLocal.userInfo as LiveData<*>)::class.java
        filedObservers.isAccessible = true
        // 获取 到 mObservers 这个成员变量 的 对象
        val objObservers = filedObservers.get(LiveDataLocal.userInfo)
        // 得到 map 的 class
        val clsObservers = objObservers.javaClass
        // 获取到 mObservers -> Map 的 get 方法
        val methodGet = clsObservers.getDeclaredMethod("get", Any::class.java)

        // 执行 get 方法
        val invoke = methodGet.invoke(objObservers, liveDataCls)

        // 得到 entry 的 value
        var observerWrapper: Any? = null
        invoke?.let {
            if (it is Map.Entry<*, *>) {
                observerWrapper == it.value
            }
        }
        if (observerWrapper == null) {
            throw NullPointerException("invoke is Null")
        }

        // 得到 observersWrapper 的类对象
        val supperCls = observerWrapper.javaClass.superclass as Class<*>
        val mLastVersionField = supperCls.getDeclaredField("mLastVersion")
        mLastVersionField.isAccessible = true

        // 得到 LiveData 的 mVersion
        val mVersionField = liveDataCls.getDeclaredField("mVersion")
        mVersionField.isAccessible = true
//        val mVersionValue = mVersionField.get(this)
        val mVersionValue = mVersionField.get(userInfoCls)
        mLastVersionField.set(observerWrapper, mVersionValue)

//        // 获取 LiveData 对象的 mVersion 字段
//        val filed = liveDataCls.getDeclaredField("mVersion")
//        filed.isAccessible = true
//        Log.d(TAG, "hook: ${filed.get(liveDataCls)}")
    }
}